home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 September / Enter 09 2006.iso / Internet / SpamExperts Home 1.1 / SpamExperts Home.exe / lib / spamexperts.modules / spambayes / Histogram.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-07-14  |  4.7 KB  |  160 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import math
  5. from spambayes.Options import options
  6.  
  7. try:
  8.     (True, False)
  9. except NameError:
  10.     (True, False) = (1, 0)
  11.  
  12.  
  13. class Hist:
  14.     '''Simple histograms of float values.'''
  15.     
  16.     def __init__(self, nbuckets = options[('TestDriver', 'nbuckets')], lo = 0.0, hi = 100.0):
  17.         self.lo = lo
  18.         self.hi = hi
  19.         self.nbuckets = nbuckets
  20.         self.buckets = [
  21.             0] * nbuckets
  22.         self.data = []
  23.         self.stats_uptodate = False
  24.  
  25.     
  26.     def add(self, x):
  27.         self.data.append(x)
  28.         self.stats_uptodate = False
  29.  
  30.     
  31.     def compute_stats(self):
  32.         if self.stats_uptodate:
  33.             return None
  34.         
  35.         self.stats_uptodate = True
  36.         data = self.data
  37.         n = self.n = len(data)
  38.         if n == 0:
  39.             return None
  40.         
  41.         data.sort()
  42.         self.min = data[0]
  43.         self.max = data[-1]
  44.         if n & 1:
  45.             self.median = data[n // 2]
  46.         else:
  47.             self.median = (data[n // 2] + data[(n - 1) // 2]) / 2.0
  48.         sum = 0.0
  49.         for x in data:
  50.             sum += x
  51.         
  52.         var = 0.0
  53.         for x in data:
  54.             d = x - mean
  55.             var += d * d
  56.         
  57.         self.var = var / n
  58.         self.sdev = math.sqrt(self.var)
  59.         for p in options[('TestDriver', 'percentiles')]:
  60.             if p <= p:
  61.                 pass
  62.             elif not p <= 100.0:
  63.                 raise AssertionError
  64.             self.pct = pct = []
  65.             i = (n - 1) * p / 100.0
  66.             pct.append((p, score))
  67.         
  68.  
  69.     
  70.     def __iadd__(self, other):
  71.         self.data.extend(other.data)
  72.         self.stats_uptodate = False
  73.         return self
  74.  
  75.     
  76.     def get_lo_hi(self):
  77.         self.compute_stats()
  78.         lo = self.lo
  79.         hi = self.hi
  80.         if lo is None:
  81.             lo = self.min
  82.         
  83.         if hi is None:
  84.             hi = self.max
  85.         
  86.         return (lo, hi)
  87.  
  88.     
  89.     def get_bucketwidth(self):
  90.         (lo, hi) = self.get_lo_hi()
  91.         span = float(hi - lo)
  92.         return span / self.nbuckets
  93.  
  94.     
  95.     def fill_buckets(self, nbuckets = None):
  96.         if nbuckets is None:
  97.             nbuckets = self.nbuckets
  98.         
  99.         if nbuckets <= 0:
  100.             raise ValueError('nbuckets %g > 0 required' % nbuckets)
  101.         
  102.         self.nbuckets = nbuckets
  103.         self.buckets = buckets = [
  104.             0] * nbuckets
  105.         (lo, hi) = self.get_lo_hi()
  106.         bucketwidth = self.get_bucketwidth()
  107.         for x in self.data:
  108.             i = int((x - lo) / bucketwidth)
  109.             if i >= nbuckets:
  110.                 i = nbuckets - 1
  111.             elif i < 0:
  112.                 i = 0
  113.             
  114.             buckets[i] += 1
  115.         
  116.  
  117.     
  118.     def display(self, nbuckets = None, WIDTH = 61):
  119.         if nbuckets is None:
  120.             nbuckets = self.nbuckets
  121.         
  122.         if nbuckets <= 0:
  123.             raise ValueError('nbuckets %g > 0 required' % nbuckets)
  124.         
  125.         self.compute_stats()
  126.         n = self.n
  127.         if n == 0:
  128.             return None
  129.         
  130.         print '%d items; mean %.2f; sdev %.2f' % (n, self.mean, self.sdev)
  131.         print '-> <stat> min %g; median %g; max %g' % (self.min, self.median, self.max)
  132.         pcts = [ '%g%% %g' % x for x in self.pct ]
  133.         print '-> <stat> percentiles:', '; '.join(pcts)
  134.         (lo, hi) = self.get_lo_hi()
  135.         if lo > hi:
  136.             return None
  137.         
  138.         self.fill_buckets(nbuckets)
  139.         biggest = max(self.buckets)
  140.         (hunit, r) = divmod(biggest, WIDTH)
  141.         if r:
  142.             hunit += 1
  143.         
  144.         print '* =', hunit, 'items'
  145.         ndigits = len(str(biggest))
  146.         bucketwidth = self.get_bucketwidth()
  147.         whole_digits = max(len(str(int(lo))), len(str(int(hi - bucketwidth))))
  148.         frac_digits = 0
  149.         while bucketwidth < 1.0:
  150.             frac_digits += 1
  151.             bucketwidth *= 10.0
  152.         format = '%' + str(whole_digits + 1 + frac_digits) + '.' + str(frac_digits) + 'f %' + str(ndigits) + 'd'
  153.         bucketwidth = self.get_bucketwidth()
  154.         for i in range(nbuckets):
  155.             n = self.buckets[i]
  156.             print format % (lo + i * bucketwidth, n), '*' * ((n + hunit - 1) // hunit)
  157.         
  158.  
  159.  
  160.